//Arduino头文件
#include <Arduino.h>

//协议层
#include "onenet.h"
#include "fault.h"
#include "net_device.h"
#include "edpkit.h"



extern NET_DEVICE_CLASS NET_DEVICE;
static EdpPacketClass EDPKIT;
extern FAULT_CLASS FAULT;



/*
************************************************************
*   函数名称： OneNet_DevLink
*
*   函数功能： 与onenet创建连接
*
*   入口参数： devid：创建设备的devid
*              auth_key：创建设备的masterKey或apiKey
*
*   返回参数： 无
*
*   说明：   与onenet平台建立连接，成功或会标记oneNetInfo.netWork网络状态标志
************************************************************
*/
void ONENET_CLASS::OneNet_DevLink(const char* devid, const char* auth_key)
{

    unsigned char *dataPtr;
  
    EDPKIT.PacketConnect1(devid, auth_key);           //根据devid和apikey封装协议包
    
    NET_DEVICE.NET_DEVICE_SendData(EDPKIT.GetData(), EDPKIT.GetWritepos());   //上传平台
    
    dataPtr = NET_DEVICE.NET_DEVICE_GetIPD(250);               //等待平台响应
    if(dataPtr != NULL)
    {
        ONENET_CLASS::netWork = ONENET_CLASS::OneNet_EDPKitCmd(dataPtr);       //解析数据
    }

    EDPKIT.ClearParameter();                 //删包
    
    if(ONENET_CLASS::netWork)                      //如果接入成功
    {
        Serial.println("OK");
    }
    else
    {
        if(++ONENET_CLASS::errCount >= 5)                //如果超过设定次数后，还未接入平台
        {
            Serial.println("error");
        }
    }
  
}

//EDP协议命令解析
_Bool ONENET_CLASS::OneNet_EDPKitCmd(unsigned char *data)
{

    if(data[0] == CONNRESP) //连接响应
    {
        //0   连接成功
        //1   验证失败：协议错误
        //2   验证失败：设备ID鉴权失败
        //3   验证失败：服务器失败
        //4   验证失败：用户ID鉴权失败
        //5   验证失败：未授权
        //6   验证失败：激活码未分配
        //7   验证失败：该设备已被激活
        //8   验证失败：重复发送连接请求包
        //9   验证失败：重复发送连接请求包
        
        if(data[3] == 0)
            return 1;
        else
            return 0;
    }
    
    return 0;

}

//上传数据到平台
bool ONENET_CLASS::OneNet_SendData(int score)
{
  
    char send_buf[256];
    
    if(!ONENET_CLASS::netWork || NET_DEVICE.NET_DEVICE_Get_DataMode() != DEVICE_DATA_MODE)    //如果网络未连接 或 不为数据收发模式
        return 1;
    
    NET_DEVICE.NET_DEVICE_Set_DataMode(DEVICE_CMD_MODE);                   //设置为命令收发模式
    memset(send_buf, 0, sizeof(send_buf));

    sprintf(send_buf, ",;score,%d;errType,%d;",score,

                      
                      FAULT.faultTypeReport);
          
    EDPKIT.PacketSavedataSimpleString(NULL, send_buf);              //封包
    
    NET_DEVICE.NET_DEVICE_SendData(EDPKIT.GetData(), EDPKIT.GetWritepos());   //上传平台

    EDPKIT.ClearParameter();                 //删包
    
    FAULT.faultTypeReport = FAULT_NONE;                           //发送之后清除标记
    
    NET_DEVICE.NET_DEVICE_Set_DataMode(DEVICE_DATA_MODE);
    
    return 0;
  
}



//替换平台下发命令中的结束符
void OneNet_Replace(unsigned char *res)
{
  
    unsigned char count = 0;
  
    while(count <= 4)
    {
        if(*res == '\0')    //找到结束符
        {
            *res = '~';     //替换
            count++;
        }
        
        res++;
    }

}

//平台下发命令解析、处理
bool ONENET_CLASS::OneNet_App(unsigned char *cmd)
{

    char *dataPtr;
    char numBuf[10];
    int num = 0;
    bool flag = 0;
    
    OneNet_Replace(cmd);
    
    dataPtr = strstr((const char *)cmd, "}");     //搜索'}'
  
    if(dataPtr != NULL)                 //如果找到了
    {
        dataPtr++;
        
        while(*dataPtr >= '0' && *dataPtr <= '9')   //判断是否是下发的命令控制数据
        {
            numBuf[num++] = *dataPtr++;
        }
        
        num = atoi((const char *)numBuf);       //转为数值形式
    }    
        
    
    NET_DEVICE.NET_DEVICE_ClrData();               //清空缓存

    return flag;
}
